Keras 패키지를 사용한 신경망 구현

Keras Modules

  • Model
    • Sequentials = neural network
    • Graph
  • Layers
    • Dense = fully connected regular neural network
    • Dropout
    • Activations
  • Activations
    • sigmoid
    • tanh
    • relu
    • softmax
  • Initializer
    • normal
    • uniform
  • Regularizer
    • l1
    • l2
    • l1l2
  • Loss
    • mean_squared_error
    • categorical_crossentropy
  • Optimizer
    • SGD

In [1]:
from keras.datasets import mnist
from keras.utils import np_utils

(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(60000, 784)
X_train = X_train.astype('float32')
X_train /= 255.0
Y_train = np_utils.to_categorical(y_train, 10)


Using Theano backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.pkl.gz
15302656/15296311 [==============================] - 13s    

In [6]:
import time
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD

model1 = Sequential()
model1.add(Dense(30, input_dim=784, activation="sigmoid", init='normal'))   #30은 인풋과 히든 가기 위한 다음 단계. 
model1.add(Dense(10, activation="sigmoid", init='normal'))
model1.compile(loss='mse', optimizer=SGD(), metrics=["accuracy"])

hist1 = model1.fit(X_train, Y_train, nb_epoch=10, batch_size=10)
time.sleep(0.1)


Epoch 1/10
 1010/60000 [..............................] - ETA: 134s - loss: 0.2280 - acc: 0.1119

ValueErrorTraceback (most recent call last)
<ipython-input-6-726cfe57bbf4> in <module>()
      9 model1.compile(loss='mse', optimizer=SGD(), metrics=["accuracy"])
     10 
---> 11 hist1 = model1.fit(X_train, Y_train, nb_epoch=10, batch_size=10)
     12 time.sleep(0.1)

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/models.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, **kwargs)
    406                               shuffle=shuffle,
    407                               class_weight=class_weight,
--> 408                               sample_weight=sample_weight)
    409 
    410     def evaluate(self, x, y, batch_size=32, verbose=1,

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight)
   1051                               verbose=verbose, callbacks=callbacks,
   1052                               val_f=val_f, val_ins=val_ins, shuffle=shuffle,
-> 1053                               callback_metrics=callback_metrics)
   1054 
   1055     def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None):

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in _fit_loop(self, f, ins, out_labels, batch_size, nb_epoch, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics)
    795                     batch_logs[l] = o
    796 
--> 797                 callbacks.on_batch_end(batch_index, batch_logs)
    798 
    799                 epoch_logs = {}

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/callbacks.pyc in on_batch_end(self, batch, logs)
     58         t_before_callbacks = time.time()
     59         for callback in self.callbacks:
---> 60             callback.on_batch_end(batch, logs)
     61         self._delta_ts_batch_end.append(time.time() - t_before_callbacks)
     62         delta_t_median = np.median(self._delta_ts_batch_end)

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/callbacks.pyc in on_batch_end(self, batch, logs)
    186         # will be handled by on_epoch_end
    187         if self.verbose and self.seen < self.params['nb_sample']:
--> 188             self.progbar.update(self.seen, self.log_values)
    189 
    190     def on_epoch_end(self, epoch, logs={}):

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/utils/generic_utils.pyc in update(self, current, values, force)
     74             prev_total_width = self.total_width
     75             sys.stdout.write("\b" * prev_total_width)
---> 76             sys.stdout.write("\r")
     77 
     78             numdigits = int(np.floor(np.log10(self.target))) + 1

/home/dockeruser/anaconda2/lib/python2.7/site-packages/ipykernel/iostream.pyc in write(self, string)
    315 
    316             is_child = (not self._is_master_process())
--> 317             self._buffer.write(string)
    318             if is_child:
    319                 # newlines imply flush in subprocesses

ValueError: I/O operation on closed file

In [7]:
hist1.history['loss']



NameErrorTraceback (most recent call last)
<ipython-input-7-aa8a0fe53eec> in <module>()
----> 1 hist1.history['loss']

NameError: name 'hist1' is not defined

In [8]:
model2 = Sequential()
model2.add(Dense(30, input_dim=784, activation="tanh"))
model2.add(Dense(10, activation="softmax"))
model2.compile(loss='categorical_crossentropy', optimizer=SGD(), metrics=["accuracy"])

hist2 = model2.fit(X_train, Y_train, nb_epoch=10, batch_size=10)
time.sleep(0.1)


Epoch 1/10
 4710/60000 [=>............................] - ETA: 63s - loss: 1.2323 - acc: 0.6892

ValueErrorTraceback (most recent call last)
<ipython-input-8-874615f178a5> in <module>()
      4 model2.compile(loss='categorical_crossentropy', optimizer=SGD(), metrics=["accuracy"])
      5 
----> 6 hist2 = model2.fit(X_train, Y_train, nb_epoch=10, batch_size=10)
      7 time.sleep(0.1)

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/models.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, **kwargs)
    406                               shuffle=shuffle,
    407                               class_weight=class_weight,
--> 408                               sample_weight=sample_weight)
    409 
    410     def evaluate(self, x, y, batch_size=32, verbose=1,

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight)
   1051                               verbose=verbose, callbacks=callbacks,
   1052                               val_f=val_f, val_ins=val_ins, shuffle=shuffle,
-> 1053                               callback_metrics=callback_metrics)
   1054 
   1055     def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None):

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in _fit_loop(self, f, ins, out_labels, batch_size, nb_epoch, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics)
    795                     batch_logs[l] = o
    796 
--> 797                 callbacks.on_batch_end(batch_index, batch_logs)
    798 
    799                 epoch_logs = {}

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/callbacks.pyc in on_batch_end(self, batch, logs)
     58         t_before_callbacks = time.time()
     59         for callback in self.callbacks:
---> 60             callback.on_batch_end(batch, logs)
     61         self._delta_ts_batch_end.append(time.time() - t_before_callbacks)
     62         delta_t_median = np.median(self._delta_ts_batch_end)

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/callbacks.pyc in on_batch_end(self, batch, logs)
    186         # will be handled by on_epoch_end
    187         if self.verbose and self.seen < self.params['nb_sample']:
--> 188             self.progbar.update(self.seen, self.log_values)
    189 
    190     def on_epoch_end(self, epoch, logs={}):

/home/dockeruser/anaconda2/lib/python2.7/site-packages/keras/utils/generic_utils.pyc in update(self, current, values, force)
     74             prev_total_width = self.total_width
     75             sys.stdout.write("\b" * prev_total_width)
---> 76             sys.stdout.write("\r")
     77 
     78             numdigits = int(np.floor(np.log10(self.target))) + 1

/home/dockeruser/anaconda2/lib/python2.7/site-packages/ipykernel/iostream.pyc in write(self, string)
    315 
    316             is_child = (not self._is_master_process())
--> 317             self._buffer.write(string)
    318             if is_child:
    319                 # newlines imply flush in subprocesses

ValueError: I/O operation on closed file

In [19]:
plt.plot(hist2.history["acc"])
plt.show()



In [17]:
model3 = Sequential()
model3.add(Dense(30, input_dim=784, activation="relu"))
model3.add(Dropout(0.2))
model3.add(Dense(10, activation='softmax'))
model3.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=["accuracy"])

%time hist3 = model3.fit(X_train, Y_train, nb_epoch=10, batch_size=10, verbose=0)


CPU times: user 43.5 s, sys: 0 ns, total: 43.5 s
Wall time: 43.5 s

In [18]:
plt.plot(hist3.history["acc"])
plt.show()